//package net.gdface.jna;
//
//import java.io.*;
//import java.util.*;
//
///**
// * Created by JackyChang on 2018/11/13.
// *
// */
//public class DataFrequentUtil {
//
//    // 频次分组幅值合key
//    public static final String DATA_KEY_GROUP_DATA = "frequentGroupData";
//    // 峰值幅值key
//    public static final String DATA_KEY_PEAK_DATA = "peakData";
//    // 峰值频次key
//    public static final String DATA_KEY_PEAK_FREQUENT = "peakFrequent";
//
//    /**
//     * 获取数据频次数据
//     * @param fftData 幅值数据
//     * @param fftFreq 频次数据
//     * @param frequentGroup 频次分组
//     * @param channelCount 通道数量
//     * @param peakDataTopN 峰值前N数量
//     * @return
//     */
//    public static Map<String, float[][]> getDataFrequent(float[] fftData, float[] fftFreq, float[] frequentGroup,
//                                                       int channelCount, int peakDataTopN){
//        Map<String, float[][]> resultMap = new HashMap<String, float[][]>();
//
//        if (channelCount <= 0 || fftData.length != fftFreq.length) return resultMap;
//
//        // 总数据量
//        int totalDataSize = fftData.length;
//        // 每个通道数据量
//        int channelDataSize = totalDataSize / channelCount;
//        // 频次分组数量
//        int freqGroupSize = frequentGroup.length / 2;
//
//        if (totalDataSize % channelCount != 0) throw new IllegalArgumentException("总数据量不能被通道数完全整除");
//        if (frequentGroup.length % 2 != 0) throw new IllegalArgumentException("频次分组数据不正确");
//
//        float[][] frequentGroupData = new float[channelCount][freqGroupSize];
//        float[][] peakData = new float[channelCount][peakDataTopN];
//        float[][] peakFrequent = new float[channelCount][peakDataTopN];
//
//        for (int i = 0; i < channelCount; i++) {
//            // 每个通道完整数据index
//            for (int j = i * channelDataSize; j < (i + 1) * channelDataSize; j++) {
//                // 按频道分组计算幅值合
//                for (int k = 0; k < freqGroupSize; k++) {
//                    if (fftFreq[j] >= frequentGroup[k * 2]
//                            && fftFreq[j] <= frequentGroup[k * 2 + 1]) {
//                        frequentGroupData[i][k] += fftData[j];
//                    }
//                }
//                // 前N峰值数据
//                if (j == i * channelDataSize
//                        || j == (i + 1) * channelDataSize - 1
//                        || (fftData[j] > fftData[j - 1] && fftData[j] > fftData[j + 1])
//                        ) {
//                    setPeakFrequentData(peakFrequent[i], fftFreq[j], setPeakData(peakData[i], fftData[j]));
//                }
//            }
//        }
//        resultMap.put(DATA_KEY_GROUP_DATA, frequentGroupData);
//        resultMap.put(DATA_KEY_PEAK_DATA, peakData);
//        resultMap.put(DATA_KEY_PEAK_FREQUENT, peakFrequent);
//
//        return resultMap;
//    }
//
//    private static int setPeakData(float[] data, float current){
//        for (int i = 0; i < data.length; i++) {
//            if (current > data[i]) {
//                float tmp;
//                for (int j = i; j < data.length; j++) {
//                    tmp = data[j];
//                    data[j] = current;
//                    current = tmp;
//                }
//                return i;
//            }
//        }
//        return -1;
//    }
//
//    private static void setPeakFrequentData(float[] data, float current, int index){
//        if (index < 0 || index >= data.length) return;
//        float tmp;
//        for (int i = index; i < data.length; i++) {
//            tmp = data[i];
//            data[i] = current;
//            current = tmp;
//        }
//    }
//
//    public static void main(String[] args) throws Exception {
//
//        List<Float> fftDataList = new ArrayList<Float>();
//        File fftFile = new File("/Users/JackyChang/Desktop/d_fft_data.txt");
//        BufferedReader bf = new BufferedReader(new FileReader(fftFile));
//        for (String line = bf.readLine(); line != null; line = bf.readLine()) {
//            for (String s : line.split(" ")) {
//                fftDataList.add(Float.valueOf(s));
//            }
//        }
//        List<Float> fftFreqDataList = new ArrayList<Float>();
//        File fftFreqFile = new File("/Users/JackyChang/Desktop/d_fft_f.txt");
//        BufferedReader bff = new BufferedReader(new FileReader(fftFreqFile));
//        for (String line = bff.readLine(); line != null; line = bff.readLine()) {
//            for (String s : line.split(" ")) {
//                fftFreqDataList.add(Float.valueOf(s));
//            }
//        }
//
//        float[] fftData = new float[fftDataList.size()];
//
//        float[] fftFreqData = new float[fftFreqDataList.size()];
//
//        for (int i = 0; i < fftData.length; i++) {
//            fftData[i] = fftDataList.get(i);
//            fftFreqData[i] = fftFreqDataList.get(i);
//        }
//
//        Map<String, float[][]> resultMap = getDataFrequent(fftData, fftFreqData, new float[]{0.0F, 0.3F, 0.3F, 0.5F, 3F, 5F, 5F, 10F}, 4, 10);
//        System.out.println(Arrays.deepToString(resultMap.get(DataFrequentUtil.DATA_KEY_GROUP_DATA)));
//        System.out.println(Arrays.deepToString(resultMap.get(DataFrequentUtil.DATA_KEY_PEAK_DATA)));
//        System.out.println(Arrays.deepToString(resultMap.get(DataFrequentUtil.DATA_KEY_PEAK_FREQUENT)));
//    }
//}
